/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2001 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.db.explorer;
import java.sql.*;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import java.lang.String;
import java.util.Properties;
import org.netbeans.lib.ddl.*;
import org.openide.TopManager;
import java.lang.reflect.*;
/**
* Connection information
* This class encapsulates all information needed for connection to database
* (database and driver url, login name and password). It can create JDBC
* connection and feels to be a bean (has propertychange support and customizer).
* Instances of this class uses explorer option to store information about
* open connection.
*
* @author Slavek Psenicka
*/
public class DatabaseConnection extends Object implements DBConnection
{
/** Driver URL and name */
private String drv, drvname;
/** Database URL */
private String db;
/** User login name */
private String usr;
/** User password */
private String pwd = "";
/** Remembers password */
private Boolean rpwd = Boolean.FALSE;
/** The support for firing property changes */
private PropertyChangeSupport propertySupport;
/** Connection name */
private String name;
public static final String PROP_DRIVER = "driver";
public static final String PROP_DATABASE = "database";
public static final String PROP_USER = "user";
public static final String PROP_PASSWORD = "password";
public static final String PROP_DRIVERNAME = "drivername";
public static final String PROP_NAME = "name";
static final long serialVersionUID =4554639187416958735L;
/** Default constructor */
public DatabaseConnection()
{
propertySupport = new PropertyChangeSupport(this);
}
/** Advanced constructor
* Allows to specify all needed information.
* @param driver Driver URL
* @param database Database URL
* @param user User login name
* @param password User password
*/
public DatabaseConnection(String driver, String database, String user, String password)
{
drv = driver;
db = database;
usr = user;
pwd = password;
}
/** Returns driver URL */
public String getDriver()
{
return drv;
}
/** Sets driver URL
* Fires propertychange event.
* @param driver DNew driver URL
*/
public void setDriver(String driver)
{
if (driver == null || driver.equals(drv)) return;
String olddrv = drv;
drv = driver;
propertySupport.firePropertyChange(PROP_DRIVER, olddrv, drv);
}
public String getDriverName()
{
return drvname;
}
public void setDriverName(String name)
{
if (name == null || name.equals(drvname)) return;
String olddrv = drvname;
drvname = name;
propertySupport.firePropertyChange(PROP_DRIVERNAME, olddrv, drvname);
}
/** Returns database URL */
public String getDatabase()
{
return db;
}
/** Sets database URL
* Fires propertychange event.
* @param database New database URL
*/
public void setDatabase(String database)
{
if (database == null || database.equals(db)) return;
String olddb = db;
db = database;
propertySupport.firePropertyChange(PROP_DATABASE, olddb, db);
}
/** Returns user login name */
public String getUser()
{
return usr;
}
/** Sets user login name
* Fires propertychange event.
* @param user New login name
*/
public void setUser(String user)
{
if (user == null || user.equals(usr)) return;
String oldusr = usr;
usr = user;
propertySupport.firePropertyChange(PROP_USER, oldusr, usr);
}
/** Returns name of the connection */
public String getName()
{
return name;
}
/** Sets user login name
* Fires propertychange event.
* @param user New login name
*/
public void setName(String value)
{
if (name == null || name.equals(value)) return;
String old = name;
name = value;
propertySupport.firePropertyChange(PROP_NAME, old, name);
}
/** Returns if password should be remembered */
public boolean rememberPassword()
{
return rpwd.equals(Boolean.TRUE);
}
/** Sets password should be remembered
* @param flag New flag
*/
public void setRememberPassword(boolean flag)
{
rpwd = (flag ? Boolean.TRUE : Boolean.FALSE);
}
/** Returns password */
public String getPassword()
{
return pwd;
}
/** Sets password
* Fires propertychange event.
* @param password New password
*/
public void setPassword(String password)
{
if (password == null || password.equals(pwd)) return;
String oldpwd = pwd;
pwd = password;
propertySupport.firePropertyChange(PROP_PASSWORD, oldpwd, pwd);
}
/** Creates JDBC connection
* Uses DriverManager to create connection to specified database. Throws
* DDLException if none of driver/database/user/password is set or if
* driver or database does not exist or is inaccessible.
*/
public Connection createJDBCConnection()
throws DDLException
{
if (drv == null || db == null || usr == null || pwd == null) throw new DDLException("insufficient information to create a connection");
Properties dbprops = new Properties();
dbprops.put("user", usr);
dbprops.put("password", pwd);
try {
/*
ClassLoader syscl = TopManager.getDefault().currentClassLoader();
Class cl = syscl.loadClass("java.sql.DriverManager");
cl = syscl.loadClass(drv);
DriverManager.registerDriver((Driver)cl.newInstance());
Method gmet = DriverManager.class.getDeclaredMethod("getConnection", new Class[] {String.class, Properties.class, ClassLoader.class});
gmet.setAccessible(true);
gmet.invoke(DriverManager.class, new Object[] {db, dbprops, syscl});
Connection connection = (Connection)gmet.invoke(DriverManager.class, new Object[] {db, dbprops, syscl});
*/
Class.forName(drv);
Connection connection = DriverManager.getConnection(db, dbprops);
return connection;
} catch (Exception e) {
throw new DDLException("cannot establish a connection to "+db+" using "+drv+"("+e+")");
}
}
/** Add property change listener
* Registers a listener for the PropertyChange event. The connection object
* should fire a PropertyChange event whenever somebody changes driver, database,
* login name or password.
*/
public void addPropertyChangeListener (PropertyChangeListener l) {
propertySupport.addPropertyChangeListener (l);
}
/** Remove property change listener
* Remove a listener for the PropertyChange event.
*/
public void removePropertyChangeListener (PropertyChangeListener l) {
propertySupport.removePropertyChangeListener (l);
}
public int hashCode()
{
return drv.hashCode()+db.hashCode()+usr.hashCode();
}
/** Compares two connections.
* Returns true if driver, database and login name equals.
*/
public boolean equals(Object obj)
{
if (obj instanceof DBConnection) {
DBConnection con = (DBConnection)obj;
return db.equals(con.getDatabase());
}
return false;
}
/** Reads object from stream */
private void readObject(java.io.ObjectInputStream in)
throws java.io.IOException, ClassNotFoundException
{
drv = (String)in.readObject();
db = (String)in.readObject();
usr = (String)in.readObject();
pwd = (String)in.readObject();
// rpwd = (Boolean)in.readObject();
rpwd = new Boolean(false);
name = (String)in.readObject();
}
/** Writes object to stream */
private void writeObject(java.io.ObjectOutputStream out)
throws java.io.IOException
{
out.writeObject(drv);
out.writeObject(db);
out.writeObject(usr);
out.writeObject(pwd);
// out.writeObject(rpwd);
out.writeObject(name);
}
public String toString()
{
return "drv: "+drv+" db: "+db+" usr: "+usr;
}
}
/*
* <<Log>>
* 11 Gandalf 1.10 11/27/99 Patrik Knakal
* 10 Gandalf 1.9 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 9 Gandalf 1.8 9/23/99 Slavek Psenicka Bug #3311
* 8 Gandalf 1.7 9/13/99 Slavek Psenicka
* 7 Gandalf 1.6 8/19/99 Slavek Psenicka English
* 6 Gandalf 1.5 7/21/99 Slavek Psenicka driver name
* 5 Gandalf 1.4 6/15/99 Slavek Psenicka support for
* in-repository mounted jdbc drivers (instead of classpath entry)
* 4 Gandalf 1.3 6/9/99 Ian Formanek ---- Package Change To
* org.openide ----
* 3 Gandalf 1.2 5/21/99 Slavek Psenicka new version
* 2 Gandalf 1.1 4/23/99 Slavek Psenicka Debug mode
* 1 Gandalf 1.0 4/23/99 Slavek Psenicka
* $
*/